/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * JRandom.java
 *
 * Created on 29-nov-2013, 14:17:38
 */

package cl.jrandom.principal;

import cl.jrandom.modelo.Grupo;
import cl.jrandom.modelo.cellRender.CRGrupo;
import cl.jrandom.modelo.listModel.LMGrupo;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;

/**
 *
 * @author profesor
 */
public class JRandom extends javax.swing.JFrame {
    private List<Grupo> grupos;
    private List<Grupo> gruposAleatorio;
    private boolean estado;
    private boolean generandose;

    /*Contador utilizado para generar los numeros de los grupos*/
    private int contador;

    /** Creates new form JRandom */
    public JRandom() {
        initComponents();
        grupos = new ArrayList<>();
        contador = 1;
        setLocationRelativeTo(null);
        /*.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cl/jrandom/recursos/imagenes/agregar.png")));*/
        this.setIconImage(new ImageIcon(getClass().getResource("/cl/jrandom/recursos/imagenes/grupo.png")).getImage());
        listaGrafica.setCellRenderer(new CRGrupo());
        generandose = false;
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        txtNombreGrupo = new javax.swing.JTextField();
        btnAgregar = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        listaGrafica = new javax.swing.JList();
        btnGenerarOrden = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        txtPausa = new javax.swing.JSpinner();
        btnLimpiarLista = new javax.swing.JButton();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("JRandom Grupos");

        txtNombreGrupo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtNombreGrupoActionPerformed(evt);
            }
        });
        txtNombreGrupo.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                txtNombreGrupoKeyReleased(evt);
            }
        });

        btnAgregar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cl/jrandom/recursos/imagenes/agregar.png"))); // NOI18N
        btnAgregar.setText("Agregar");
        btnAgregar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAgregarActionPerformed(evt);
            }
        });

        listaGrafica.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        listaGrafica.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                listaGraficaMouseReleased(evt);
            }
        });
        jScrollPane1.setViewportView(listaGrafica);

        btnGenerarOrden.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cl/jrandom/recursos/imagenes/random.png"))); // NOI18N
        btnGenerarOrden.setText("Generar orden");
        btnGenerarOrden.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnGenerarOrdenActionPerformed(evt);
            }
        });

        jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cl/jrandom/recursos/imagenes/pause.png"))); // NOI18N
        jLabel1.setText("Pausa en milis:");

        txtPausa.setModel(new javax.swing.SpinnerNumberModel(40, 40, 1000, 5));

        btnLimpiarLista.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cl/jrandom/recursos/imagenes/limpiar.png"))); // NOI18N
        btnLimpiarLista.setText("Limpiar lista");
        btnLimpiarLista.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimpiarListaActionPerformed(evt);
            }
        });

        jMenu1.setText("Archivo");

        jMenuItem1.setText("Abrir");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem1);

        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addGap(23, 23, 23)
                        .addComponent(txtPausa))
                    .addComponent(btnGenerarOrden, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(txtNombreGrupo)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnAgregar))
                    .addComponent(btnLimpiarLista, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtNombreGrupo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnAgregar))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 142, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(txtPausa, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnGenerarOrden)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnLimpiarLista)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void btnAgregarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAgregarActionPerformed
        guardarGrupo(txtNombreGrupo.getText());
    }//GEN-LAST:event_btnAgregarActionPerformed

    private void btnGenerarOrdenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGenerarOrdenActionPerformed
        if(btnGenerarOrden.getText().equalsIgnoreCase("Generar orden")){
            generandose = true;
            btnGenerarOrden.setText("Detener generación");
            estado = true;
            new Thread(new Runnable() {

                @Override
                public void run() {
                    while(estado){
                        try {
                            generarOrden();
                            Thread.sleep(Integer.parseInt(txtPausa.getValue().toString()));
                        } catch (InterruptedException ex) {
                            Logger.getLogger(JRandom.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }
            }).start();
        }else{
            estado = false;
            generandose = false;
            btnGenerarOrden.setText("Generar orden");
        }
        btnLimpiarLista.setEnabled(!generandose);
    }//GEN-LAST:event_btnGenerarOrdenActionPerformed

    private void txtNombreGrupoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtNombreGrupoActionPerformed

    }//GEN-LAST:event_txtNombreGrupoActionPerformed

    private void txtNombreGrupoKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtNombreGrupoKeyReleased
        if(evt.getKeyCode() == KeyEvent.VK_ENTER){
            guardarGrupo(txtNombreGrupo.getText());
        }
    }//GEN-LAST:event_txtNombreGrupoKeyReleased

    private void btnLimpiarListaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnLimpiarListaActionPerformed
        limpiarLista();
    }//GEN-LAST:event_btnLimpiarListaActionPerformed

    private void listaGraficaMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_listaGraficaMouseReleased
        if(evt.getClickCount() == 2){
            this.btnGenerarOrdenActionPerformed(null);
        }
    }//GEN-LAST:event_listaGraficaMouseReleased

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed
        JFileChooser chooser = new JFileChooser();
        if(chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION){
            try {
                File ar = chooser.getSelectedFile();
                
                Scanner scan = new Scanner(ar);
                
                while(scan.hasNext()){
                    guardarGrupo(scan.nextLine());
                }
            } catch (FileNotFoundException ex) {
                Logger.getLogger(JRandom.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }//GEN-LAST:event_jMenuItem1ActionPerformed

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JRandom().setVisible(true);
            }
        });
    }

    private void agregarGrupo(Grupo nuevo){
        grupos.add(nuevo);
    }

    private void agregarGrupoAListaAleatoria(Grupo nuevo){
        gruposAleatorio.add(nuevo);
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAgregar;
    private javax.swing.JButton btnGenerarOrden;
    private javax.swing.JButton btnLimpiarLista;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JList listaGrafica;
    private javax.swing.JTextField txtNombreGrupo;
    private javax.swing.JSpinner txtPausa;
    // End of variables declaration//GEN-END:variables

    private void listarGrupos(final List<Grupo> lista) {
        listaGrafica.setModel(new LMGrupo(lista));
    }

    /*Método para verificar si existe un grupo determinado
     en la lista de grupos aleatorios*/
    private boolean estaEnGrupoAleatorio(int numeroGrupo){
        /*Recorro los grupos*/
        for(Grupo grupo : gruposAleatorio){
            /*Si el grupo es distinto de null*/
            if(grupo != null){
                /*si es el grupo que ando buscando, es porque
                 esta en la lista*/
                if(grupo.getNumero() == numeroGrupo){
                    return true;
                }
            }
        }

        /*Si se sale del ciclo, quiere decir que
         no encontro ese grupo*/
        return false;
    }


    /*Obtiene un grupo de la lista a partir de su numero*/
    private Grupo getGrupo(int numero){
        for(Grupo grupo : grupos){
            if(grupo.getNumero() == numero){
                return grupo;
            }
        }

        return null;
    }

    /*Método para gruardar un grupo en la lista. Esta hecho como
     método porque lo llamo desde el evento key enter y desde el botón
     agregar*/
    private void guardarGrupo(String nombre) {
        Grupo nuevo;

        nuevo = new Grupo(contador, nombre);

        contador++;

        /*Agrego el nuevo grupo a la lista de grupos*/
        agregarGrupo(nuevo);

        /*Muestro esos grupos de forma gráfica*/
        listarGrupos(grupos);

        txtNombreGrupo.setText("");
        txtNombreGrupo.requestFocus();
    }

    private void generarOrden() {
        try{
            /*Cada vez que presiono el botón
            debo crear una nueva lista de grupos, la que
            se va a encargar de almacenar los grupos
            pero de forma aleatoria*/
           gruposAleatorio = new ArrayList<>();

           /*Clase que me permite generar numeros aleatorios*/
           Random random = new Random();


           /*Contador que me permite ir recorriendo
            todos los grupos*/
           int cont = 0;

           /*Variable que almacenara el numero aleatorio generado*/
           int numeroAleatorio;

           /*Cantidad de grupos*/
           int cantidadDeGrupos = grupos.size();

           /*ciclo para recorrer todos los grupos*/
           while(cont < cantidadDeGrupos){
               do{
                   /*Genero un numero aleatorio y le sumo 1.
                    Esto es para que no comience de cero, si no de 1*/
                   numeroAleatorio = random.nextInt(cantidadDeGrupos) + 1;

                   /*Si el número generado ya esta en la lista de
                    grupos aleatorios, volverá a generar otro número*/
               }while(estaEnGrupoAleatorio(numeroAleatorio));

               /*En este punto, se ha generado un numero que no esta
                en la lista, por ende, debo rescatar a ese grupo*/
               Grupo grupo = getGrupo(numeroAleatorio);

               /*y luego lo agrtego a la otra lista. La lista de
                grupos aleatorios*/
               agregarGrupoAListaAleatoria(grupo);


               /*Aumento el contador para seguir recorriendo
                los grupos*/
               cont++;
           }


           /*Una vez afuera del ciclo, o sea, una vez terminado
            listo los grupos, pero ahora los grupos de forma aleatoria*/
           listarGrupos(gruposAleatorio);
        }catch(Exception e){
            System.out.println("Exception: "+e.getMessage());
        }
    }

    private void limpiarLista() {
        grupos = new ArrayList<>();
        gruposAleatorio = new ArrayList<>();
        listarGrupos(grupos);
        
        contador = 1;
    }

}
